package compilador.semantico.comando;

import compilador.Command;
import compilador.CommandException;
import compilador.semantico.GerenciadorDeContexto;
import compilador.semantico.SemanticException;
import compilador.semantico.TabelaSemantica;
import compilador.semantico.Tipo;
import compilador.semantico.Variavel;

public class VerificaIdentificadorCommand implements Command {

	public void run(String... args) throws CommandException {
		String id = args[0];
		GerenciadorDeContexto pilha = GerenciadorDeContexto.getInstance();
		TabelaSemantica tabela = TabelaSemantica.getInstance();

		if (!(id.equals("self") && pilha.isEmpty())) {
			Variavel var = pilha.top();
			String tp = var.getTipo();
			if (tabela.ehPrimitivo(tp)) {
				throw new SemanticException("O topo da pilha eh um tipo primitivo (" + tp + "), impossivel acessar a variavel " + id);
			} else if ( !tabela.containsTemp(id)) {
				var = tabela.getTipo(tp);
				if (var.temFilhos()) {
					Tipo tipo = (Tipo) var;
					if (tipo.getFilho(id) == null) {
						throw new SemanticException("Identificador invalido: " + id);
					}
				}
			}
		}
	}

}
